Members
Overall Objectives
Research Program
Application Domains
Software and Platforms
New Results
Bilateral Contracts and Grants with Industry
Partnerships and Cooperations
Dissemination
Bibliography
XML PDF e-pub
PDF e-Pub


Section: Application Domains

Analyse statique de programmes/Static analysis of computer programs

L'interprétation abstraite est une technique, introduite par P. et R. Cousot  [89] , qui permet de déterminer des invariants de programmes en calculant des points fixes minimaux d'applications monotones définies sur certains treillis. On associe en effet à chaque point de contrôle du programme un élément du treillis, qui représente une sur-approximation valide de l'ensemble des valeurs pouvant être prises par les variables du programme en ce point. Le treillis le plus simple exprimant des propriétés numériques est celui des produits Cartésiens d'intervalles. Des treillis plus riches permettent de mieux tenir compte de relations entre variables, en particulier, des classes particulières de polyèdres sont souvent employées.

Voici, en guise d'illustration, un petit exemple de programme, avec le système de point fixe associé, pour le treillis des intervalles:

Table 1.

void main() {

  int x=0;         // 1

  while (x<100) {  // 2

    x=x+1;         // 3

  }                // 4

}

x 1 = [ 0 , 0 ] x 2 = ] - , 99 ] ( x 1 x 3 ) x 3 = x 2 + [ 1 , 1 ] x 4 = [ 100 , + [ ( x 1 x 3 )

Si l'on s'intéresse par exemple aux valeurs maximales prise par la variable x au point de contrôle 2, soit x2+:=maxx2, après une élimination, on parvient au problème de point fixe:

qui a pour plus petite solution x2+=99, ce qui prouve que x est majoré par 99 au point 2.

On reconnait ici un opérateur de point fixe associé à un problème de jeux à deux joueurs et somme nulle. Cette analogie est en fait générale, dans le cadre d'un collaboration que l'équipe entretient depuis plusieurs années avec l'équipe MeASI d'Eric Goubault (CEA et LIX), spécialiste d'analyse statique, nous avons en effet mis progressivement en évidence une correspondance  [88] , [109] , entre les problèmes de jeux à somme nulle et les problèmes d'analyse statique, qui peut se résumer par le dictionnaire suivant:

Table 2.
Jeux Interprétation abstraite
système dynamique programme
opérateur de Shapley fonctionnelle
espace d'état (# points de contrôle) × (# degrés de liberté du treillis)
problème en horizon n exécution de n pas
limite du problème en horizon fini invariant optimal (borne)
itération sur les valeurs itération de Kleene

Pour que le nombre d'états du jeu soit fini, il est nécessaire de se limiter à des treillis d'ensembles ayant un nombre fini de degrés de liberté, ce qui est le cas de domaines communément utilisés (intervalles, ensembles définis par des contraintes de potentiel de type xi-xjcst, mais aussi, les “templates” qui sont des sous-classes de polyèdres introduits récemment par Sankaranarayanan, Sipma et Manna  [166] ). L'ensemble des actions est alors fini si on se limite à une arithmétique affine. Signalons cependant qu'en toute généralité, on aboutit à des jeux avec un taux d'escompte négatif, ce qui pose des difficultés inédites. Cette correspondance entre jeux et analyse statique est non intuitive, au sens où les actions du minimiseur consistent à sélectionner des points extrêmes de certains polyèdres obtenus par un mécanisme de dualité.

Une pathologie bien répertoriée en analyse statique est la lenteur des algorithmes de point fixe, qui peuvent effectuer un nombre d'itérations considérable (99 itérations pour obtenir le plus petit point fixe de (8 )). Celle-ci est usuellement traitée par des méthodes d'accélération de convergence dites d'élargissement et rétrécissement  [90] , qui ont cependant l'inconvénient de conduire à une perte de précision des invariants obtenus. Nous avons exploité la correspondance entre analyse statique et jeux pour développer des algorithmes d'une nature très différente, s'inspirant de nos travaux antérieurs sur l'itération sur les politiques pour les jeux répétés  [110] , [83] , [84] ,[7] . Une version assez générale de cet algorithme, adaptée au domaine des templates, est décrite dans  [109] et a fait l'objet d'une implémentation prototype. Chaque itération combine de la programmation linéaire et des algorithmes de graphes. Des résultats expérimentaux ont montré le caractère effectif de la méthode, avec souvent un gain en précision par rapport aux approches classiques, par exemple pour des programmes comprenant des boucles imbriquées.

Ce domaine se trouve être en pleine évolution, un enjeu actuel étant de traiter d'une manière qui passe à l'échelle des invariants plus précis, y compris dans des situations où l'arithmétique n'est plus affine.

English version

The abstract interpretation method introduced by P. and R. Cousot  [89] , allows one to determine automatically invariants of programs by computing the minimal fixed point of an order preserving map defined on a complete lattice. To every breakpoint of the program is associated an element of the lattice, which yields a valid overapproximation of the set of reachable values of the vectors of variables of the program, at this breakpoint. The simplest lattice expressing numerical invariants consists of Cartesian products of intervals. More sophisticated lattices, taking into account relations between variables, consisting in particular of subclasses of polyhedra, are often used.

As an illustration, we gave before Eqn (8 ) a simple example of program, together with the associated fixed-point equation. In this example, the value of the variable x at the breakpoint 2 is bounded by the smallest solution x2+ of the fixed point problem (8 ), which is equal to 99.

The fixed point equation (8 ) is similar to the one arising in the theory of zero-sum repeated games. This analogy turns out to be general. Un a series of joint works of our team with the MeASI team of Eric Goubault (CEA and LIX), we brought progressively to light a correspondence  [88] , [109] , between the zero-sum game problems and the static analysis problems, which can be summarized by the following dictionnary:

Table 3.
Games Abstract interpretation
dynamical system program
Shapley operator functional
state space (# breakpoints) × (# degrees of freedom)
horizon n problem execution of n logical steps
limit of the value in horizon n optimal invariant (bound)
value iteration Kleene iteration

For the game to have a finite state space, we must restrict our attention to lattices of sets with a finite number of degrees of freedom, which is the case of the domains commonly used in static analysis (intervals, sets defined by potentials constraints of the form xi-xjcst, and also the subclasses of polyhedra called “templates”, introduced recently by Sankaranarayanan, Sipma and Manna  [166] ). Then, the action space is finite if the arithmetics of the program is affine. However, in full generality, the games we end up with have a negative discount rate, which raises difficulties which are unfamiliar from the game theory point of view. This correspondence between games and static analysis turns out to be non intuitive, in that the action of the minimizer consist of selecting an extreme point of a polyhedron arising from a certain duality construction.

A well known pathology in static analysis is the fact that the standard Kleene fixed point algorithm may have a very slow behavior (99 iterations are needed to get the smallest fixed point of (8 )). This is usually solved by using some accelerations of convergence, called widening and narrowing  [90] , which however lead to a loss of precision. We exploited the correspondence between static analysis and games to develop algorithms of a very different nature, inspired by our earlier work on policy iteration for games  [110] , [83] , [84] ,[7] . A rather general version of this policy iteration algorithm, adpated to the domain of templates, is described in  [109] , together with a prototype implementation. Every iteration combines linear programming and combinatorial algorithms. Some experimental results indicate that the method often leads to invariants which are more accurate than the ones obtained by alternative methods, in particular for some programs with nested loops.

This topic of research is currently evolving, a question of current interest being to find accurate invariants, in a scalable way, in situations in which the arithmetics is not affine.